mercoledì, febbraio 22, 2012

Costruzione di cluster MPICH2 per .NET

Costruire un cluster con i computer che vanno dismessi è sicuramente un'alternativa conveniente, perlomeno per chi sa cosa farsene. Il calcolo parallelo è una realtà diffusa in molti ambiti, dalle implementazioni cloud al calcolo scientifico. Per quest'ultimo è particolarmente conveniente utilizzare un cluster quando si abbiano a disposizione dei programmi "paralleli", cioè, in soldoni, che usino le librerie MPICH2 (tralasciamo la versione 1 di tali librerie perchè non rappresenta più lo standard de facto, anche se aveva il pregio di funzionare in cluster eterogenei).
In questo articolo vorrei presentare, senza la pretesa di essere un informatico professionale, la realizzazione di un cluster a partire da 13 PC P4 1.5GB con Windows XP SP3. L'obiettivo è quello di mettere in grado il cluster di far girare codice parallelo scritto utilizzando i linguaggi VB.NET e C# oltre che i classici programmi in Fortran, C e C++. Verrà brevemente riportata nel seguito la metodologia utilizzata per selezionare gli strumenti di partenza, per configurarli e per testarli.

Strumenti necessari
E' necessario procurarsi dapprima le librerie MPICH2 scaricabili da qui (Argonne). Per esigenze di compatibilità con i programmi da utilizzare (nel mio caso, OpenseesMP) viene adottata la versione 1.3.1 scaricabile da qui in versione a 32bit. A mio personalissimo avviso è meglio limitare programmi paralleli fatti in casa e di conseguenza le librerie di supporto alle versioni x86, vista la grande documentazione ed esperienza a riguardo che si può trovare in rete.
La seconda esigenza di poter utilizzare programmi in VB.NET o C# ci mette di fronte a 2 scelte: o si adotta l'infrastruttura pronta di Microsoft (Windows HPC Server 2008, che è a 64bit) oppure si usa l'implementazione dell'Università dell'Indiana chiamata MPI.NET. Si decide di optare per la seconda possibilità causa la mancanza di hardware adatto per il server Microsoft. E' comunque necessario scaricare le librerie di runtine MPI di Ms, disponibili qui (l'ultima versione, qualsiasi altra precedente andava bene).
Finalmente, nell'ordine vengono installati in ogni macchina:
- librerie MPICH2 dell'Argonne (mpich2-1.3.1-win-ia32.msi);
- librerie Microsoft HPC Pack 2008 R2, versione 32bit nel cluster e 64bit nel mio portatile per lo sviluppo (l'installazione sui sistemi a 64bit è bloccata per il pacchetto di librerie a 32bit; in ogni caso nel sistema Microsoft di possono far girare insieme) (mpi_x86.msi);
- librerie MPI.NET per il runtime (MPI.NET Runtime.msi).

Configurazione
Facciamo altri pochi step per settare il cluster: 
1 - per ogni macchina è consigliabile disattivare il firewall di Windows o, se questo non è possibile per qualsivoglia motivo, aprire tutte le porte necessarie per la comunicazione, che sono:
   - porta TCP 8676 per il servizio in ascolto Argonne + una serie di porte per lo scambio dati settabili dall'utente tramite la variabile d'ambiente MPICH_PORT_RANGE da aggiungere nel sistema.
   - porta TCP 8677 per il servizio in ascolto Microsoft MPI.
2 - settare lo stesso utente amministrativo in tutte le macchine. Se siete in un dominio l'operazione è facile, se non esiste il dominio la migliore alternativa è quella di utilizzare il meccanismo di trusting di Windows, cioè semplicemente usare stesso nome utente e password per l'account amministrativo in tutti i PC.
3 - per le MPICH2 dell'Argonne è necessario registrare l'utente amministrativo locale (come abbbiamo detto, lo stesso per tutto il cluster) tramite il programma wmpiregister disponibile nel menu Start dopo l'installazione, oppure fare il tutto tramite la riga di comando:

mpiexec -register user

dove user  è il nome utente sopracitato.
3 - indipendentemente dal firewall, è necessario avviare manualmente il servizio smpd.exe contenuto nella cartella di installazione del pacchetto Microsoft usato prima (tipicamente C:\Program Files\Microsoft HPC Pack 2008 R2\Bin). Va avviato con l'opzione "-d" per indicare che lo avviamo in debug mode. Per automatizzare il tutto si rimanda ai miei programmi disponibili su giovanni.rinaldin.org . Attenzione che il servizio va avviato con le credenziali dell'utente amministratico comune di cui in precendenza. Il servizio occupa solo la porta 8677 come detto.
4 - nella cartella C:\Program Files\Microsoft HPC Pack 2008 R2\Bin, rinominare il programma mpiexec.exe in mpiexecms.exe. Inoltre aggiungere nel PATH di sistema la cartella C:\Program Files (x86)\MPICH2\bin.

Infine, si consiglia di mettere tutte le macchine in una sottorete privata diversa ma accessibile da altre reti per il lancio dei job e la copia dei risultati, ma l'argomento rete, qui, è secondario (perché per le vere prestazioni è necessario utilizzare una rete InfiniBand o Gigabit Ethernet).
Le macchine (d'ora in poi chiamate "nodi") sono ora pronte per entrare nel cluster.

Testing
Saranno testate le due librerie (Argonne e Microsoft) per verificare il corretto funzionamento. Il test è di fondamentale importanza per individuare possibili problemi nel trasporto di dati via rete, come la mancata risoluzione degli indirizzi, porte bloccate da firewall e così via.
Per testare le librerie Argonne è possibile compilare uno degli esempi forniti a corredo con il pacchetto installato. Gli esempi si trovano in C:\Program Files (x86)\MPICH2\examples o simili. Il comando di lancio è:

mpiexec -np N -machinefile mfile.txt \\nomecomputer\condivisa\cpi.exe

dove N è il numero di macchine interessate, mfile.txt è un file plain text contenente i nomi delle macchine (uno per riga - questo secondo me è il metodo più comodo, vedere anche l'opzione -hosts), "condivisa" è una cartella condivisa che tutte le macchine possono vedere, infine cpi.exe è l'esempio di calcolo del pi greco via integrazione fornito nelle librerie. Se tutto va a buon fine il lancio non visualizza errori e il programma richiede un numero di intervalli di integrazione. Tanto è più alto, tanto il pi greco sarà preciso.

Passiamo ora al test delle librerie Microsoft. Possiamo utilizzare il programma PingPong.exe fornito con gli esempi nell'SDK del pacchetto MPI.NET, in modo da testare la corretta installazione anche di questo.
E' necessario, se non si è loggati in Windows con lo stesso account amministratore con cui vengono eseguiti i job in rete, eseguite il comando "runas" nella shell prima di lanciare il lavoro. Il comando di lancio è il seguente:

mpiexecms -np N -machinefile mfile.txt -dir \\nomecomputer\condivisa \\nomecomputer\condivisa\PingPong.exe

dove i nomi sono quelli adottati nell'esempio precedente, con l'aggiunta del flag -dir che specifica la directory di lavoro. Tale flag è necessario perchè se non ci fosse le librerie Microsoft cercano la cartella locale dove sta l'eseguibile in tutti i PC, e questa potrebbe non esistere. Se questo test va a buon fine, compariranno una serie di messaggi contenenti i nomi di ogni macchina coinvolta.

Conclusioni
Si è mostrato come costruire un cluster con le librerie Argonne e Microsoft HPC senza utilizzare il Windows Server. Tale configurazione non garantisce prestazioni elevate e un controllo stretto dei job lanciati, ma è molto utile in ambiente di sviluppo e ricerca. Infine, molti altri programmi (ad es. OpenSeesMP, ABAQUS, ecc.) di appoggiano a tali librerie per eseguire lavori in parallelo.

Nessun commento: